//======================================================================
//文件名称：tm1637_led_kb.h
//功能概要：TM1637_LED_KB软件构件头文件
//相关说明：TM1637为带键盘扫描接口的共阳极数码管驱动控制芯片
//版权所有：江苏电子-索明何
//版本更新：2023-03-13  V1.0
//======================================================================
#ifndef  _TM1637_H                 //防止重复定义（开头）
#define  _TM1637_H

//1.头文件包含
#include  "common.h"               //包含公共要素软件构件头文件
#include  "gpio.h"                 //包含GPIO底层驱动构件头文件

//2.宏定义
//(1)TM1637硬件构件接口引脚宏定义（由实际的硬件连接决定）
#define  TM1637_CLK    (PTA|4)     //TM1637_CLK使用的端口/引脚
#define  TM1637_DIO    (PTA|5)     //TM1637_DIO使用的端口/引脚

//(2)数码管位数宏定义（根据实际应用，灵活定义所使用数码管的位数1~6）
#define  LED_NUM    4              //4位数码管

//3.定义限于本软件构件的全局变量
//(1)定义存放数码管笔形码的数组（TM1637的SEG1~SEG8对应数码管的h~a）
static const uint8 LED_table[ ]=
{ 
    //0    1      2    3      4    5      6    7     8     9     数组下标
    //0    1      2    3      4    5      6    7     8     9     显示0～9   
    0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,
	
    //10    11   12    13    14    15    16    17    18   19     数组下标
    //0.    1.   2.    3.    4.    5.    6.    7.    8.    9.    显示0.～9.
    0xBF, 0x86, 0xDB, 0xCF, 0xE6, 0xED, 0xFD, 0x87, 0xFF, 0xEF,	
	
    //20   21    22    23    24    25    26    27    28   29     数组下标
    //A     b     C    d      E    F     H     —    全亮  全灭   显示字母、负号、全亮、全灭		
    0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x76, 0x40, 0xFF, 0x00
};

//(2)定义存放键值与键名对应表的数组
//在实际应用中，可根据实际硬件修改键值或键名
static const uint8 kb_table[ ]=
{   //第1列     第2列      第3列      第4列
    0xEF,'1',  0x6F,'2',  0xAF,'3',  0x2F,'A',   //第1行
    0xF7,'4',  0x77,'5',  0xB7,'6',  0x37,'B',   //第2行
    0xD7,'7',  0x57,'8',  0x97,'9',  0x17,'C',   //第3行
    0xCF,'*',  0x4F,'0',  0x8F,'#',  0x0F,'D',   //第4行	
    0xFF     //无键被按下
}; 

//4.对外接口函数声明
//======================================================================
//函数名称：tm1637_init
//函数功能：将TM1637的CLK和DIO引脚对应的MCU引脚均设置为GPIO输出功能
//函数参数：无
//函数返回：无
//函数调用示例：
//   tm1637_init( );            //对TM1637进行初始化
//======================================================================
void tm1637_init(void);

//======================================================================
//函数名称：tm1637_leds_display
//函数功能：TM1637驱动数码管动态显示（最多6位数码管）
//函数参数：*buff: 用于指向数码管显示数据缓冲区的首地址（可用实参数组名作为函数实参）
//函数返回：无
//函数调用示例：
//   tm1637_leds_display(a);       //TM1637驱动数码管动态显示保存在数组a中的数据
//======================================================================
void tm1637_leds_display(uint8 *buff);

//======================================================================
//函数名称：tm1637_leds_clear
//函数功能：TM1637控制数码管清屏
//函数参数：无
//函数返回：无
//函数调用示例：
//   tm1637_leds_clear( );         //TM1637控制数码管清屏
//======================================================================
void tm1637_leds_clear(void);

//======================================================================
//函数名称：led_buff_update
//函数功能：更新数码管显示数据缓冲区（对应笔形码数组中的下标）
//函数参数：dispdata:  在多位数码管上显示的数据（整数）
//          led_buff[]: 用于接收数码管显示数据缓冲区的首地址（可用实参数组名作为函数实参）
//函数返回：无
//相关说明：若控制多位数码管显示整数1234，则可先通过调用该函数，使数码管显示数据缓冲区
//          （数组）中的多个数据更新为数字1、2、3、4对应的笔形码数组下标1、2、3、4
//函数调用示例：
//   led_buff_update(1234, a);     //将数组a中的数码管显示数据更新为1、2、3、4
//======================================================================
void led_buff_update(uint32 dispdata, uint8 led_buff[]);
	
//======================================================================
//函数名称：tm1637_kb_scan
//函数功能：TM1637扫描矩阵式键盘
//函数参数：无
//函数返回：若有键被按下，则返回被按下键对应的键名（'1'、'2'、'3'、...），否则返回0xFF
//函数调用示例：
//    tm1637_kb_scan( );          //TM1637扫描矩阵式键盘，获取被按下键的键名
//======================================================================
uint8 tm1637_kb_scan(void);

#endif        //防止重复定义（结尾）
